package JDK8新特性_集合.Stream的终结方法;

import JDK8新特性_集合.Stream流的中间方法.Student;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collector;
import java.util.stream.Collectors;

public class Test {
    public static void main(String[] args) {
        // 终结方法指的是调用完成后, 不会返回Stream了, 没法继续使用流了.

        List<Student> students = new ArrayList<>();
        Student s1 = new Student("蜘蛛精", 26, 172.5);
        Student s2 = new Student("蜘蛛精", 26, 172.5);
        Student s3 = new Student("紫霞", 23, 167.6);
        Student s4 = new Student("白晶晶", 25, 169.0);
        Student s5 = new Student("牛魔王", 35, 183.3);
        Student s6 = new Student("牛夫人", 34, 168.5);
        Collections.addAll(students, s1, s2, s3, s4, s5, s6);

        // 1. void forEach(Consumer action): 对此流运算后的元素执行遍历

        // 2. long count(): 统计此流运算后的元素个数

        // 3. Optional<T> max(Comparator<? super T> comparator): 获取此流运算后的最大值元素

        // 4. Optional<T> min(Comparator<? super T> comparator): 获取此流运算后的最小值元素

        // 需求1: 请计算出身高超过168的学生由几人
        long size = students.stream().filter(s -> s.getHeight() > 168).count();
        System.out.println(size);

        // 需求2: 请找出身高最高的学生对象, 并输出
        Student st1 = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();
        System.out.println(st1);

        // 需求3: 请找出身高最矮的学生对象, 并输出
        Student st2 = students.stream().min((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())).get();
        System.out.println(st2);


        // 5. R collect(Collector collector): 把流处理后的结果收集到一个指定的集合中去

        // 6. Object[] toArray(): 把流处理后的结果收集到一个数组中去


        // 收集Stream流: 就是把Stream流操作后的结果转回到集合或者数组中去返回

        // 需求4: 请找出身高超过170的学生对象, 并放到一个新集合中去返回
        List<Student> list = new ArrayList<>();
        list = students.stream().filter(s -> s.getHeight() > 170).collect(Collectors.toList());
        System.out.println(list);

        // 需求5: 请找出身高超过170的学生对象, 并把学生对象的名字和身高,存入到一个Map集合返回
        Map<String, Double> map = students.stream().filter(a -> a.getHeight() > 170).distinct().collect(Collectors.toMap(s -> s.getName(), s -> s.getHeight()));
        System.out.println(map);

        Object[] array = students.stream().filter(a -> a.getHeight() > 170).toArray();
        // 如果要创建自定义类数组就得这样写
        Student[] array1 = students.stream().filter(a -> a.getHeight() > 170).toArray(s -> new Student[s]);

    }
}
